﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text.RegularExpressions;
using skhukb.DB;
using skhukb.BL;
using skhukb.Models;

namespace skhukb.Controllers
{
    [Authorize]
    public class BbsArticleController : Controller
    {

        [HttpGet]
        public ActionResult List(int id, int page, int size, int category, int srchType, string srchText)
        {
            var 정보 = BL.게시판.Get현재페이지정보(id);
            if (page == 0) page = 정보.현재페이지;
            if (size == 0) size = 정보.페이지크기;
            if (category == 0) category = 정보.게시글분류;
            if (srchType == 0) { srchType = 정보.검색유형; srchText = 정보.검색어; }
            if (srchText == null || srchText.Trim().Length == 0) srchType = 0;
            BL.게시판.Set현재페이지정보(id, page, size, category, srchType, srchText);

            using (var db = new DBDataContext()) {
                var 게시판 = db.게시판.FirstOrDefault(p => p.ID == id);
                if (게시판 == null) return HttpNotFound();

                var list = db.게시글.Where(p => p.게시판ID == 게시판.ID && (category == BL.게시판.게시글분류_전체 || p.게시글분류ID == category));
                if (srchType == BL.게시판.검색_제목) list = list.Where(p => p.제목.Contains(srchText));
                if (srchType == BL.게시판.검색_제목내용) list = list.Where(p => p.제목.Contains(srchText) || p.내용.Contains(srchText));
                if (srchType == BL.게시판.검색_작성자) list = list.Where(p => p.사용자.이름 == srchText);

                var 모델 = new BbsArticleListModel() {
                    게시판 = new 게시판Model(게시판),
                    게시글목록 = list.OrderByDescending(p => p.ID).Skip((page - 1) * size).Take(size).Select(p => new 게시글Model(p, false)).ToList(),
                    게시글분류목록 = BL.게시판.게시글분류목록(id, 전체항목_포함: true),
                    게시글분류 = category,
                    페이지정보 = new PaginationModel {
                        URL = Url.BbsArticleList(id, 989898, size).Replace("989898", "{0}"),
                        현재페이지 = page,
                        총페이지수 = (int)Math.Ceiling((double)list.Count() / (double)size)
                    },
                    검색유형 = srchType,
                    검색어 = srchText
                };
                return View(모델);
            }
        }

        [HttpGet]
        public ActionResult Detail(long id)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.게시글.FirstOrDefault(p => p.ID == id);
                if (글 == null) return HttpNotFound();

                var 모델 = new BbsArticleDetailModel {
                    게시글 = new 게시글Model(글, true),
                    게시판 = new 게시판Model(글.게시판),
                    수정권한 = BL.게시판.글수정권한(글)
                };
                return View(모델);
            }
        }

        [HttpGet]
        public ActionResult New(int id)
        {
            return View("Edit", new BbsArticleEditModel { 
                게시글 = new 게시글Model() { 게시판ID = id, 게시글분류ID = 1 }, 
                게시글분류목록 = BL.게시판.게시글분류목록(id) 
            });
        }

        [HttpGet]
        public ActionResult Edit(long id)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.게시글.FirstOrDefault(p => p.ID == id);
                if (글 == null) return HttpNotFound();

                var 모델 = new BbsArticleEditModel {
                    게시글 = new 게시글Model(글, true),
                    게시글분류목록 = BL.게시판.게시글분류목록(글.게시판ID)
                };
                return View(모델);
            }
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult Save(BbsArticleEditModel 모델) // referenced by Edit.cshtml
        {
            string url = "";
            if (String.IsNullOrEmpty(모델.게시글.제목)) return Json(new JsonModel { success = false, message = Consts.제목오류 });
            if (String.IsNullOrEmpty(모델.게시글.내용)) return Json(new JsonModel { success = false, message = Consts.내용오류 });
            using (var db = new DBDataContext()) {
                if (모델.게시글.ID == 0) {
                    게시글 새글 = 모델.게시글.to게시글(); // 폼에 입력된 값 복사됨
                    var list = db.게시글.Where(p => p.게시판ID == 모델.게시글.게시판ID);
                    새글.번호 = (list.Count() > 0) ? list.Max(p => p.번호) + 1 : 1;
                    새글.작성자ID = 현재사용자.사용자.ID;
                    새글.수정일 = DateTime.Now;
                    db.게시글.InsertOnSubmit(새글);
                    db.SubmitChanges(); // 새글의 ID를 생성해야 하므로..

                    url = Url.BbsArticleListInit(모델.게시글.게시판ID);
                    이미지첨부정보_저장(db, 새글);
                    db.SubmitChanges();
                } else {
                    var 글1 = db.게시글.FirstOrDefault(p => p.ID == 모델.게시글.ID);
                    if (글1 == null) return HttpNotFound();
                    if (BL.게시판.글수정권한(글1) == false) return Json(new JsonModel { success = false, message = Consts.권한없음 });

                    글1.제목 = 모델.게시글.제목;
                    글1.내용 = 모델.게시글.내용;
                    글1.게시글분류ID = 모델.게시글.게시글분류ID;
                    글1.수정일 = DateTime.Now;
                    db.게시글이미지첨부.DeleteAllOnSubmit(db.게시글이미지첨부.Where(p => p.게시글ID == 모델.게시글.ID));
                    url = Url.BbsArticleDetail(모델.게시글.ID);
                    이미지첨부정보_저장(db, 글1);
                    db.SubmitChanges();
                }
                return Json(new JsonModel { success = true, url = url }); 
            }
        }

        private static void 이미지첨부정보_저장(DBDataContext db, 게시글 글)
        {
            Regex 찾을패턴 = new Regex(@"/Image/Download/([0-9]+)");
            var 찾은목록 = 찾을패턴.Matches(글.내용);
            foreach (Match match in 찾은목록) {
                var id = long.Parse(match.Groups[1].Value);
                db.게시글이미지첨부.InsertOnSubmit(new 게시글이미지첨부 { 게시글ID = 글.ID, 이미지ID = id });
            }
        }

        [HttpPost] 
        [skhukb.Util.AjaxOnly]
        public ActionResult Delete(long id)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.게시글.FirstOrDefault(p => p.ID == id);
                if (글 == null) return HttpNotFound();
                if (BL.게시판.글수정권한(글) == false) return Json(new JsonModel { success = false, message = Consts.권한없음 });

                int 게시판ID = 글.게시판ID;
                db.게시글이미지첨부.DeleteAllOnSubmit(db.게시글이미지첨부.Where(p => p.게시글ID == id));
                db.이미지.DeleteAllOnSubmit(db.이미지.Where(p => db.게시글이미지첨부.Any(q => q.게시글ID == id && q.이미지ID == p.ID)));
                db.덧글.DeleteAllOnSubmit(db.덧글.Where(p => p.대상구분 == Consts.덧글대상_게시글 && p.대상ID == id));
                db.게시글.DeleteOnSubmit(글);
                db.SubmitChanges();
                return Json(new JsonModel { success = true, url = Url.BbsArticleList(게시판ID) });
            }
        }


    }
}
